package generatoreLALR;
import albero.ASDUtil;
import asd.Demo8;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.Iterator;
import java.util.LinkedList;
import javax.swing.JTree;
import albero.NTree;
import albero.Nodo;
import albero.TreeUtil;

/**
 * Il main permette il parsing di un file, o di una stringa inserita manualmete.
 * Ad ogni riga, o stringa inserita, viene generato l'albero sintattico decorato.
 * 
 * @author Giovanni Cammarata
 */
public class Main {
    
	public static void main(String args[]) throws IOException {
                
            StringReader str;
            LinkedList<String> errori = new LinkedList();
            int numErrori = 5;
	
		Parser yyparser;
		
                if (args.length!=0) {
                    if (args.length==1) 
                        {
                            numErrori = Integer.parseInt(args[0]);
                            while(true) {

                                System.out.print("Inserisci input ");
                                BufferedReader variabile = new BufferedReader(new InputStreamReader(System.in));
                                String strletta = variabile.readLine()+"\n";
                                str = new StringReader(strletta);
                                yyparser = new Parser(str,false,numErrori);
                                yyparser.yyparse();
                                buildASD(yyparser,strletta);
                            }

                        }
                    else  {
                            
                                numErrori = Integer.parseInt(args[0]);
                        
                                String strletta;
                                FileInputStream fstream = new FileInputStream(args[1]);
                                DataInputStream in = new DataInputStream(fstream);
                                BufferedReader br = new BufferedReader(new InputStreamReader(in));
                                String strLine;
                                while ((strletta = br.readLine()) != null) {

                                    str = new StringReader(strletta);
                                    yyparser = new Parser(str,false,numErrori);
                                    yyparser.yyparse();
                                    buildASD(yyparser,strletta);

                                }

                                in.close();

                        }
                }
                else {
                    System.out.print("ATTENZIONE: devi inserire almeno il numero massimo di errori\n");
                }

                          
	}
        
        
        private static JTree buildTree(NTree<Nodo> treeP) {            
                TreeUtil<Nodo> util = new TreeUtil<Nodo>();
                return util.buildJTree(treeP);
        }
        
        
        /**
         * Permette la costruzione dell'albero sintattico decorato.
         * Dapprima verifico se il parser ha generato errori.
         * In caso di errori stampo gli errori rilevati, 
         * altrimenti presento l'albero sintattico decorato.
         * @param Parser 
         */
        private static void buildASD(Parser yyparser,String strletta) {  
            
            TreeUtil<Nodo> util = new TreeUtil<Nodo>();
            ASDUtil utilasd = new ASDUtil();
            if (!yyparser.getErroreRilevato()) {
                
                //if(!yyparser.getTree().isEmpty()) {
                if(yyparser.getRootASD()!=null) {
                    //util.stampaNodi(yyparser.getTree());
                    utilasd.stampaNodi(yyparser.getRootASD());
                    //Demo8 prova = new Demo8(yyparser.getTree());
                    Demo8 prova2 = new Demo8(yyparser.getRootASD(),strletta);
                }
            }
            else {
                Iterator it = yyparser.geterrorList().iterator();
                System.out.println("Rilevati "+yyparser.geterrorList().size() +" errori!");
                while(it.hasNext()) 
                    System.out.println( ((String)it.next()));
            }
        }

}

